// 文件名：firfe_北京时间.js

/**
 * 获取当前北京时间的年、月、日、时、分、秒、毫秒
 * @param {Date} [_时间=new Date()] - 输入的时间对象，默认为当前时间
 * @returns {{
 *   年: number,
 *   月: number,
 *   日: number,
 *   时: number,
 *   分: number,
 *   秒: number,
 *   毫秒: number,
 *   日期: string,
 *   时间: string,
 *   字符串: string,
 *   星期: number
 * }} 包含年月日时分秒毫秒和格式化字符串的对象
 */

function fn获取北京时间(_时间 = new Date()) {
  // 使用 Intl.DateTimeFormat 确保时区为 Asia/Shanghai
  const _格式化器 = new Intl.DateTimeFormat("zh-CN", {
    timeZone: "Asia/Shanghai",
    year: "numeric",
    month: "2-digit",
    day: "2-digit",
    hour: "2-digit",
    minute: "2-digit",
    second: "2-digit",
    fractionalSecondDigits: 3, // 毫秒位数
    hour12: false,
  });

  // 拆解各部分
  const _部分 = _格式化器.formatToParts(_时间);
  const [日期, 时间] = _格式化器.format(_时间).split(" ");

  const _获取值 = (type) => {
    const _项 = _部分.find((p) => p.type === type);
    return _项 ? parseInt(_项.value) : 0;
  };

  const _北京时间字符串 = _时间.toLocaleString("en-CA", { 
    timeZone: "Asia/Shanghai",
    year: "numeric",
    month: "2-digit",
    day: "2-digit"
  });
  
  const _北京时间 = new Date(_北京时间字符串);
  const _星期几 = _北京时间.getDay();

  return {
    年: _获取值("year"),
    月: _获取值("month"),
    日: _获取值("day"),
    时: _获取值("hour"),
    分: _获取值("minute"),
    秒: _获取值("second"),
    毫秒: _时间.getUTCMilliseconds(),
    日期: 日期.replace(/\//g, "-"),
    时间: 时间,
    字符串: `${日期.replace(/\//g, "-")}T${时间}`,
    星期: _星期几,
  };
}

// 导出函数
module.exports = fn获取北京时间;